perm filename HEAP.SAI[2,BGB] blob
sn#001238 filedate 1972-12-18 generic text, type T, neo UTF8
00100 BEGIN "HEAP SORT"
00200 REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;
00300 REQUIRE "RANDOM[SYS,BGB]" SOURCE_FILE;
00400 REQUIRE "TIMER[SYS,BGB]" SOURCE_FILE;
00500
00600 INTEGER ARRAY A[1:10000];
00700
00800 PROCEDURE HEAPSORT (INTEGER ARRAY A; INTEGER N);
00900 BEGIN "HEAPSORT"
01000 INTEGER I,J,K;
01100 INTEGER X,Q;
01200 α PHASE ONE, PUT 'EM UNDER THE HEAP & BIGGIES TRICKLE UP;
01300 FOR K←2 STEP 1 UNTIL N DO
01400 BEGIN
01500 I←K;
01600 X←A[K];
01700 WHILE I>1 ∧ X>A[J←I%2] DO
01800 BEGIN A[I]←A[J]; I←J END;
01900 A[I]←X;
02000 END;
02100 α PHASE TWO, TAKE 'EM OFF THE TOP & PROMOTE SUBORDINATES;
02200 FOR K←N STEP -1 UNTIL 2 DO
02300 BEGIN
02400 X←A[K];A[K]←A[1];I←1;
02500 WHILE (J←2*I)<K DO
02600 BEGIN
02700 IF A[J+1]>A[J] ∧ (J+1)<K THEN J←J+1;
02800 IF X≥A[J] THEN DONE ELSE
02900 BEGIN A[I]←A[J];I←J;END;
03000 END;
03100 A[I]←X;
03200 END;
03300 END "HEAPSORT";
03400
03500 INTEGER Q;
03600 FOR Q←1 STEP 1 UNTIL 1000 DO A[Q]←1000*RANDOM;
03700 INTIME;
03800 HEAPSORT(A,1000);
03900 FOR Q←1 STEP 1 UNTIL 1000-1 DO
04000 IF A[Q]>A[Q+1] THEN BEGIN OUTSTR("SORT ERROR ! ");INCHRW;END;
04100 OUTIME;
04200 INCHRW;
04300 END "HEAP SORT";